<?php
/*
 * SoloPHP PHP框架
 * $Author: Yotianya <yotianya@gmail.com>
 * $Dtime:2011-10-24
 * $Copyright: CopyRight By SoloPHP Yotianya
 */

define('SoloPHP_VERSION', '1.0.0'); 										// 当前框架版本
header("content-Type: text/html; charset=utf-8 ");
$GLOBALS['C']= require(CORE.'Config.php');									//获取配置
if (substr(PHP_VERSION, 0, 1) != '5') errorMsg('PHP_Version',PHP_VERSION);	//判断php的版本
if ($GLOBALS['C']['Common']['Session']) session_start();					//是否自动开启session
if ($GLOBALS['C']['Common']['Debug']) {										//如果是调试模式，打开警告输出
	if( substr(PHP_VERSION, 0, 3) == "5.3" ){
		error_reporting(E_ALL & ~E_NOTICE & ~E_WARNING & ~E_DEPRECATED);
	}else{
		error_reporting(E_ALL & ~E_NOTICE & ~E_WARNING);
	}
} else {
	error_reporting(0);
}
@set_magic_quotes_runtime(0);												//关闭过滤
date_default_timezone_set('PRC');

 	/**
 	 * 框架运行时间
 	 */
	function runTime(){
		global $START_TIME;
		return  number_format((microtime(TRUE)-$START_TIME),5);
	}
 	/**
 	 * mkdirs循环建立目录的辅助函数
 	 * @param dir    目录路径
 	 * @param mode    文件权限
 	 */
	function mkdirs($dir, $mode = 0777)
	{
		if (!is_dir($dir)) {
			mkdirs(dirname($dir), $mode);
			return @mkdir($dir, $mode);
		}
		return true;
	}
	/*
 	 * 错误提示; 输出错误信息 
 	 * 如果Debu为真则显示详细，否则直接显示“访问出错”跳回或到主页
 	 */
	function errorMsg($errorKey, $detail = '',$errorfile='') {

		$erroHtml= '<div style="border:dashed 1px #ccc;padding:10px;background-color:#F4F5F7;color:red;font-size:12px; line_height:25px;">!';

		if ($GLOBALS['C']['Common']['Debug']) {
			static $errorArray=array();
			$errorArray = require (CORE . 'Error.php');
			if(array_key_exists($errorKey,$errorArray)){
				echo $erroHtml.$errorArray[$errorKey] .' : ' . $detail.'</div>';
			}else{
				echo $erroHtml.'访问问出错，错误键没有定义'.$errorKey;
			}
		}else{
				echo $erroHtml.'配置文件访问出错!</div>';
		}
		exit();
	}
 	/**
 	 * cacheAccess 数据缓存及存取程序
 	 *
 	 * @param method    数据存取模式，取值"w"为存入数据，取值"r"读取数据，取值"c"为删除数据
	 * @param name    标识数据的名称
 	 * @param value    存入的值，在读取数据和删除数据的模式下均为NULL
 	 * @param life_time    变量的生存时间，默认为永久保存
 	 */
	function cacheAccess($method, $name, $value = NULL, $life_time = -1){
	
		// 准备缓存目录和缓存文件名称，缓存文件名称为$name的MD5值，文件后缀为php
		if(!is_dir(CACHE.'cache_data/'))mkdirs(CACHE.'cache_data/');
		$sfile = CACHE.'cache_data/'.md5($name).".php";
		// 对$method进行判断，分别进行读写删的操作
		if('w' == $method){
			// 写数据，在$life_time为-1的时候，将增大$life_time值以令$life_time不过期
			$life_time = ( -1 == $life_time ) ? '300000000' : $life_time;
			// 准备存入缓存文件的数据，缓存文件使用PHP的die();函数以便保证内容安全，
			$value = '<?php die();?>'.( time() + $life_time ).serialize($value); // 数据被序列化后保存
			return file_put_contents($sfile, $value);
		}elseif('c' == $method){
			// 清除数据，直接移除改缓存文件
			return @unlink($sfile);
		}else{
			// 读数据，检查文件是否可读，同时将去除缓存数据前部的内容以返回
			if( !is_readable($sfile) )return FALSE;
			$arg_data = file_get_contents($sfile);
			// 获取文件保存的$life_time，检查缓存是否过期
			if( substr($arg_data, 14, 10) < time() ){
				@unlink($sfile); // 过期则移除缓存文件，返回FALSE
				return FALSE;
			}
			return unserialize(substr($arg_data, 24)); // 数据反序列化后返回
		}
	}
	/**
	 * mkUrl
	 *
	 * URL模式的构建函数
	 *
	 * @param controller    控制器名称
	 * @param action    动作名称
	 * @param args    传递的参数，数组形式
	 * @param anchor    跳转锚点
	 * @param no_sphtml    是否应用Html静态设置
	 */
	function mkUrl($controller = null, $action = null, $args = null, $anchor = null, $html = FALSE) {
	
		$arrayUrl = array();
		$arrayUrl['d'] = $GLOBALS['url']['d'];
		$arrayUrl['c'] = ($controller == null)?$GLOBALS['url']['c']:$controller;
		$arrayUrl['a'] = ($action == null)?$GLOBALS['url']['a']:$action;
		$url = (implode('/',$arrayUrl));
		$url = ((isset($GLOBALS['C']['Common']['ReWrite']) && $GLOBALS['C']['Common']['ReWrite']))?$url:'/'.$url;//判断ReWrite伪静态
		if(null != $args)$url .='/';foreach($args as $key => $arg) $url .= "{$key}/{$arg}";
		if(null != $anchor) $url .= "#".$anchor;
		echo $url;
	}
	function local($args){  //本地地址 带参数
	
		mkUrl(null,null,$args);
		}
	
	/**
	 * 添加'\'  转义过滤函数
	 * $force：强制转换
	 * $strip强制使用stripslashes函数
	 */
	function escapeStr($string, $force = 0, $strip = 0) {
		!defined('MAGIC_QUOTES_GPC') && define('MAGIC_QUOTES_GPC', get_magic_quotes_gpc());
		if(!MAGIC_QUOTES_GPC || $force) {
			if(is_array($string)) {
				foreach($string as $key => $val) {
					$string[$key] = escapeStr($val, $force);
				}
			} else {
	
				$string = mysql_escape_string($strip ? stripslashes($string) : $string);
			}
		}
		return $string;
	}
	/**
	 * 加载文件,可自动搜索加载Extend\Action下的文件
	 * 判断文件是否存在
	 * 避免重复加载
	 */

	function importFile($file,$autoSearch=false) {
		
		static $isLoad=array();
		$actiondir=(APP_FILE=='index')?'default/':APP_FILE.'/';
		$actiondir =CONTROLLER.$actiondir;
		$importFile =str_replace ( '/', S, $file );
		if(isset($isLoad[md5($importFile)])) return true;
		if( is_readable($importFile) ){
			$isLoad[md5($importFile)]=true;
			require($importFile);
			return true;
		}elseif($autoSearch===true){
			$autoFilePath=array(ODB,EXTENSIONS,CORE,LIB,$actiondir);
			foreach($autoFilePath as $autoPath){
				$autoImportFile=$autoPath.$file;
				if(isset($isLoad[md5($autoImportFile)])) return true;
				if( is_readable($autoImportFile) ){
					$isLoad[md5($autoImportFile)]=true;
					require_once($autoImportFile);
					return true;
				}
			}//foreach
		}else{errorMsg ( 'fileNotExist', $importFile);}//else

	}
 	/**
	 * 加载并实例化类; 返回值：类对象
 	 * 取得类名
 	 * 加载类文件
 	 * 判断是否已存在该实例，避免重复实例化同一个类
 	 */
	function newClass($classFile, $args =array(),$autoSearch=true) {

		static $isNew=array();
		$arr = explode ( '/',$classFile);
		$className = $arr [count ( $arr ) - 1] ;

		importFile($classFile.'.class.php',$autoSearch);

		if(isset($isNew[$className])){
			return $isNew[$className];
		}else{
			if(class_exists($className) || interface_exists($className)){
			$isNew[$className] = new $className($args);
			return $isNew[$className];
			}else{
			errorMsg( 'classError', $className);
			}
		}
	}

	/**
	 * 是否为AJAX链接或提交方式
	 */
	function isAjax() {

	if(isset($_SERVER['HTTP_X_REQUESTED_WITH']) && 'xmlhttprequest' == strtolower($_SERVER['HTTP_X_REQUESTED_WITH']))return true;
	if(!empty($_POST['AJAX_SUBMIT']) || !empty($_GET['AJAX_SUBMIT']))return true;
	return false;
	}
	
 	/**
	 * 跳转页面
	 */	
	function location($url='',$time=0){
		$url=ACT.'/'.$url;
		echo '<meta http-equiv="Refresh" content='.$time.';URL='.$url.'>';
	}

	function jump($url, $noteMsg='',$time=0,$linkMsg='') {

		$pre=substr($url,-5);
		($pre=='.html')? $url=APP.$url: $url=ACT.$url;
		$msg  = '<div style="border:solid 1px #ccc;padding:5px;background-color:#eee;color:444;font-size:12px;">
		'.$noteMsg.' 系统将在'.$time.'秒之后自动跳转';
		(!empty($linkMsg))? $msg .='到'.$linkMsg.' &nbsp;&nbsp;&nbsp;<a href='.$url.'>'.$linkMsg.'</a></div>':$msg .='</div>';
		$str = '<meta http-equiv="Refresh" content='.$time.';URL='.$url.'>';
		if($time!=0) $str .= $msg;
		exit($str);

	}

 	/**
 	 * 获得IP地址
 	 */
	function getIP()
	{
		if ( getenv( "HTTP_CLIENT_IP" ) )
		{
			$_httpip = getenv( "HTTP_CLIENT_IP" );
			return $_httpip;
		}
		if ( getenv( "HTTP_X_FORWARDED_FOR" ) )
		{
			$_httpip = getenv( "HTTP_X_FORWARDED_FOR" );
			return $_httpip;
		}
		if ( getenv( "HTTP_X_FORWARDED" ) )
		{
			$_httpip = getenv( "HTTP_X_FORWARDED" );
			return $_httpip;
		}
		if ( getenv( "HTTP_FORWARDED_FOR" ) )
		{
			$_httpip = getenv( "HTTP_FORWARDED_FOR" );
			return $_httpip;
		}
		if ( getenv( "HTTP_FORWARDED" ) )
		{
			$_httpip = getenv( "HTTP_FORWARDED" );
			return $_httpip;
		}
		$_httpip = $_SERVER['REMOTE_ADDR'];
		return $_httpip;
	}
	/**
	 * 删除文件夹下的文件夹以及里面的文件
	 */
	function delFileDir( $dirName )
	{
		if ( $handle = opendir( "$dirName" ) ) {
			while ( false !== ( $item = readdir( $handle ) ) ) {
				if ( $item != "." && $item != ".." ) {
					if ( is_dir( "$dirName/$item" ) ) {
						delFileDir( "$dirName/$item" );
						if( rmdir("$dirName/$item") )echo "成功删除目录： $dirName/$item<br />\n";
					} else {
						if( unlink( "$dirName/$item" ) )echo "成功删除文件： $dirName/$item<br />\n";
	
					}
				}
			}
			closedir( $handle );
		}
	}
	/**
	 * 取得目录下的所有目录名
	 */
	function dirupName($dir){
		if (is_dir($dir)){
			if ($dh = opendir($dir)){
				$name='';
				while (($file = readdir($dh)) !== false){
					if (!preg_match("/\.|\)/",$file)){
						$name .=$file;
					}
				}
				closedir($dh);
				return($name);
			}
		}
	}
	
	/**
	 * 加密算法  密码+设定字符串拼接
	 */
	function enccode($password){
	
		return md5($GLOBALS['C']['DB']['passchar'].$password.'solo');
	
	}
?>